springmvc 框架原理
springmvc执行流程:
- 前端控制器(DispatcherServlet), 接受请求,然后请求 处理器映射器(HanderMapping)
- HanderMapping 根据 xml / 注解 进行查找相关的 handler,并返回给 前端控制器
- 前端控制器 调用 处理器适配器(HanderAdapter)按照一定规则去执行 handler
- handler执行完毕后,返回给 HanderAdapter ModelAndView,HandlerAdapter 再返回给 前端控制器
- 前端控制器 将 ModelAndView 发送给 视图解析器(ViewResolver),试图解析器根据试图名解析为真正的视图
- 视图解析器解析后,将view 返回给 前端控制器,前端控制器 进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域
- 前端控制器 向用户相应结果
重要的组件:
- 前端控制器 DispatherServlet:接受请求,相应结果,转发器的作用
- 处理器映射器 HandlerMapping: 根据配置查找 handler
- 处理器适配器 HandlerAdapter: 按照规则去执行 handler
- 处理器 Handler: 业务处理
- 视图解析器 ViewResolver: 进行视图解析,将ModelAndView解析为真正的view
springmvc 基本配置
如果不在 springmvc.xml 配置相关的映射器、适配器,spring会使用默认的,默认的配置 在 DispatcherServlet.properties 中:
这些默认的都不建议使用了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| # Default implementation classes for DispatcherServlet's strategy interfaces. # Used as fallback when no matching beans are found in the DispatcherServlet context. # Not meant to be customized by application developers. org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\ org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\ org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\ org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\ org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\ org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
|
Spring 3.1之后 使用的 映射器 和 适配器:
org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
springmvc.xml 中的约束配置,参考文档进行配置:
1 2 3 4 5 6 7 8 9
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> </beans>
|
基本配置:
web.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>springmvcdemo1</display-name> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvcConfig.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
|
springmvc.xml 基本配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> 开发时候使用它 : --> <mvc:annotation-driven /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <context:component-scan base-package="com.gjr.controller"/> </beans>
|
参数绑定
此处举例,具体看项目
@RequestMap中的简单类型,直接安装相关参数进行设置即可
对于包装类型 pojo, 客户端请求时候,相关的参数必须要和Pojo的属性名称一致
如:
1 2 3 4 5 6 7 8
| public class ItemsQueryVo { private Items items; private ItemsCustom itemsCustom; }
|
1 2 3 4 5
| @RequestMapping(value = "/editItemsSubmit") public ModelAndView editItemsSubmit(Integer id, ItemsQueryVo itemsQueryVo) throws Exception { return modelAndView; }
|
前端页面请求时候,表单信息中:
1
| <input name=“itemsCustom.name” …/>
|
Spring 校验相关
使用的是 Hibernate 的校验框架:
1 2 3 4 5
| <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.3.4.Final</version> </dependency>
|
具体看项目。。。
附录
demo 地址:
https://github.com/fenglincanyi/ssmdemo